import type { Settings as LayoutSettings } from '@ant-design/pro-layout';
import { PageLoading } from '@ant-design/pro-layout';
import { message, notification } from 'antd';
import type { RequestConfig, RunTimeLayoutConfig } from 'umi';
import { history } from 'umi';
import RightContent from '@/components/RightContent';
// import Footer from '@/components/Footer';
import type { RequestOptionsInit, ResponseError } from 'umi-request';
import { currentUser as queryCurrentUser } from '@/services/login/login';
import { BookOutlined, LinkOutlined } from '@ant-design/icons';
import allow from '../config/allow'
import Footer from './components/Footer';

const isDev = process.env.NODE_ENV === 'development';


/** 获取用户信息比较慢的时候会展示一个 loading */
export const initialStateConfig = {
  loading: <PageLoading />,
};

/**
 * @see  https://umijs.org/zh-CN/plugins/plugin-initial-state
 * */
export async function getInitialState(): Promise<{
  settings?: Partial<LayoutSettings>;
  currentUser?: LoginResponse.UserInfo;
  fetchUserInfo?: () => Promise<LoginResponse.UserInfo | undefined>;
}> {
  const fetchUserInfo = async () => {
    try {
      const currentUser = await queryCurrentUser();
      if(currentUser.code === 200){
        return currentUser.data;
      }
    } catch (error) {
      
      history.push('/user/login');
    }
    return undefined;
  };
  // 如果是登录页面，不执行
  const { location } = history;
  
  if (!(allow.indexOf(location.pathname) + 1)) {
    const currentUser = await fetchUserInfo();
    return {
      fetchUserInfo,
      currentUser,
      settings: {},
    };
  }
  return {
    fetchUserInfo,
    settings: {},
  };
}

// https://umijs.org/zh-CN/plugins/plugin-layout
export const layout: RunTimeLayoutConfig = ({ initialState }) => {
  return {
    rightContentRender: () => <RightContent />,
    disableContentMargin: false,
    footerRender: () => <Footer />,
    onPageChange: () => {
      const { location } = history;
      // 如果没有登录，重定向到 login
      if (!initialState?.currentUser && !(allow.indexOf(location.pathname) + 1)) {
        window.console.log(initialState)
        history.push('/user/login');
      }
    },
    links: isDev
      ? [
        <>
          <LinkOutlined />
          <span
            onClick={() => {
              window.open('/umi/plugin/openapi');
            }}
          >
            openAPI 文档
            </span>
        </>,
        <>
          <BookOutlined />
          <span
            onClick={() => {
              window.open('/~docs');
            }}
          >
            业务组件文档
            </span>
        </>,
      ]
      : [],
    menuHeaderRender: undefined,
    // 自定义 403 页面
    // unAccessible: <div>unAccessible</div>,
    ...initialState?.settings,
  };
};

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  405: '请求方法不被允许。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
};

/** 异常处理程序
 * @see https://beta-pro.ant.design/docs/request-cn
 */
const errorHandler = (error: ResponseError) => {
  const { response } = error;
  if (response && response.status) {
    const errorText = codeMessage[response.status] || response.statusText;
    const { status, url } = response;
    if(status === 401){
      message.info("登陆已过期，请重新登陆！")
      history.push("/user/login")
      throw error;
    }
    if(status === 403){
      message.warn("权限不足，可向超级管理员索取")
      throw error;
    }

    notification.error({
      message: `请求错误 ${status}: ${url}`,
      description: errorText,
    });
  }

  if (!response) {
    notification.error({
      description: '您的网络发生异常，无法连接服务器',
      message: '网络异常',
    });
  }
  throw error;
};
// 请求拦截添加token
const authHeaderInterceptor = (url: string, options: RequestOptionsInit) => {
  const localtoken: any = localStorage.getItem('token')
  const tokendata: LoginResponse.TokenData = JSON.parse(localtoken)
  let access_token = ''
 
  if(tokendata){
     // 过期token
     if (tokendata.access_token) {
       access_token = tokendata.access_token
     }
  }
  // checktoken(tokendata.expires_in)
  
  const authHeader = { 'Authorization': `Bearer ${  access_token}` }
  return {
    url: `${url}`,
    options: { ...options, interceptors: true, headers: authHeader },
  };
};

// https://umijs.org/zh-CN/plugins/plugin-request
export const request: RequestConfig = {
  errorHandler,
  // 请求拦截
  requestInterceptors:[authHeaderInterceptor]
};

